package com.sky.task;

import com.sky.entity.Orders;
import com.sky.mapper.OrderMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;

@Slf4j
//@Component
public class OrderTask {
    @Resource
    private OrderMapper orderMapper;
    /**
     * 处理支付超时任务
     *
     * 通过定时任务每分钟检查一次是否存在支付超时订单
     * （下单后超过15分钟仍未支付则判定为支付超时订单），
     * 如果存在则修改订单状态为“已取消”
     */
    @Scheduled(cron = "0 0/1 * * * ?")
    public void processTimeoutOrder(){
        log.info("[处理支付超时任务] 开始执行");
        //每隔1分钟检查一次是否存在支付超时订单
        Integer payStatus = Orders.UN_PAID; //支付状态为"待支付"
        LocalDateTime timeout = LocalDateTime.now().minusMinutes(15);   //小于timeout就说明超时了
        List<Orders> ordersList = orderMapper.selectPaymentTimeout(payStatus,timeout);
        if(ordersList==null || ordersList.isEmpty()){
            return;
        }
        ordersList.forEach(order->{
            log.info("[处理支付超时任务] 订单编号为: {}的订单存在支付超时",order.getNumber());
            //将支付超时的订单状态修改为"已取消"
            order.setStatus(Orders.CANCELLED);
            orderMapper.update(order);
        });
    }
    /**
     * 通过定时任务每天凌晨1点检查一次
     * 检查前一天的订单中还处在"派送中"的订单
     * 如果存在则修改订单状态为“已完成”
     */
    @Scheduled(cron = "0 0 1 * * ?")
    public void processDeliveryOrder(){
        log.info("[处理配送中的订单] 开始执行");
        Integer status = Orders.DELIVERY_IN_PROGRESS;
        LocalDateTime dateTime = LocalDateTime.now().minusMinutes(1);
        List<Orders> ordersList = orderMapper.selectDelivery(status,dateTime);
        if(ordersList==null || ordersList.isEmpty()){
            return;
        }
        ordersList.forEach(order->{
            log.info("[处理配送中的订单] 订单编号为: {}的订单还处在配送中",order.getNumber());
            //将还处在"派送中"的订单状态修改为“已完成”
            order.setStatus(Orders.COMPLETED);
            orderMapper.update(order);
        });
    }
}